/**
 * 
 */
package com.code.google.p.jyve.berekeningen;

import java.util.ArrayList;

import com.code.google.p.jyve.Graph.GuardDog;
import com.code.google.p.jyve.SimpleGuardDog;
import com.code.google.p.jyve.berekeningen.Berekening.Equivalentable;

/**
 * Guard dog die minder berekeningen uitvoert in de buurt van de equivalentie punten.
 * Gebruikt Berekening.Equivalentable om de equivalentie punten te vinden.
 * Als de Berekening Equivalentable niet implementeert, wordt SimpleGuardDog gebruikt.
 * 
 * Op het moment reageert het express alleen op 2-waardige.
 * 
 * Na testen blijkt dat de curve niet mooi is.
 * @author jyve1
 *
 */
public class AdvancedGuardDag implements GuardDog {

	/**
	 * De afwijking van de hoeveelheid titrant bij de equivalentie punt.
	 */
	public static final double VARATION = 0.05d;

	/* (non-Javadoc)
	 * @see com.code.google.p.jyve.Graph.GuardDog#suggest(com.code.google.p.jyve.berekeningen.Berekening, double, double, double)
	 */
	@Override
	public double[] suggest(Berekening berekening, double xPrecision,
			double yPrecision, double xEnd) {
		if ((berekening instanceof Equivalentable) && (berekening instanceof TweewaardigZwakkeBerekening)){
			Equivalentable eq = (Equivalentable) berekening;
			double[] points = eq.getEquivalences();
			// Belachelijk slechte code, nooit nadoen!!!
			SimpleGuardDog guard = new SimpleGuardDog();
			double[] waardes = guard.suggest(berekening, xPrecision, yPrecision, xEnd);
			ArrayList<Double> komende = new ArrayList<Double>();
			for (double i : waardes){
				komende.add(i);
			}
			ArrayList<Double> toRemove = new ArrayList<Double>();
			for (double point : points){
				for (int i = 0; i < komende.size(); i++){
					Double value = komende.get(i);
					if (Math.abs(value - point) < point * VARATION){
						toRemove.add(value);
					}
				}
			}
			for (Double i : toRemove){
				komende.remove(i);
			}
			double[] teruggeven = new double[komende.size()];
			int index = 0;
			for (double i : komende){
				teruggeven[index] = i;
				index++;
			}
			return teruggeven;
		}
		else {
			SimpleGuardDog guardDog = new SimpleGuardDog();
			return guardDog.suggest(berekening, xPrecision, yPrecision, xEnd);
		}
	}

}
